package problems.practice;

/**
 * 28. 实现strStr() - KMP算法应用
 * <p>https://leetcode.cn/problems/implement-strstr/
 * <p>
 * @author habitplus
 * @since 2022/8/14 15:13
 */
public class T28 {
    public int strStr(String haystack, String needle) {
        int n = haystack.length(), m = needle.length();
        if (m == 0) {
            return 0;
        }
        // 获取 next 数组
        int[] next = new int[m];
        for (int i = 1, j = 0; i < m; i++) {
            while (j > 0 && needle.charAt(i) != needle.charAt(j))
                j = next[j - 1];
            if (needle.charAt(i) == needle.charAt(j))
                j++;
            next[i] = j;
        }

        for (int i = 0, j = 0; i < n; i++) {
            while (j > 0 && haystack.charAt(i) != needle.charAt(j))
                j = next[j - 1];

            if (haystack.charAt(i) == needle.charAt(j))
                j++;

            if (j == m) return i - m + 1;
        }
        return -1;
    }
}
